package com.mybatis.crudservice.dao;

import com.mybatis.crudservice.tools.MapperUtils;
import com.mybatis.crudservice.tools.PageInfo;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @ 描 述 : 查询服务单独封装
 * @ 作 者 : 一念〃
 * @ 时 间 : 22:46 2019/5/24
 * @ 备 注 :
 */
@Component
public class ReadDao {

    @Autowired
    private SqlSessionTemplate session;

    /**
     * 查询单条
     * @param mapperName - mapper.xml文件名 - 不带后缀
     * @param selectName - mapper接口的方法名，与xml文件中id相对应
     * @param params - 参数 - Map格式，可为空
     * @return
     */
    public Map<String, Object> readOne(String mapperName, String selectName, Object params) {
        PageInfo<Map<String, Object>> page = new PageInfo(1, 1);

        readList(mapperName, selectName, params, page);

        return page.getTotal() > 0L ? (Map)page.getRows().get(0) : null;
    }

    /**
     * 查询所有 - 默认1000条
     * @param mapperName xml文件名
     * @param selectName id方法名
     * @param params 参数
     * @return
     */
    public List<Map<String, Object>> readAll(String mapperName, String selectName, Object params) {
        return readList(mapperName, selectName, params, (PageInfo)null).getRows();
    }

    /**
     * 查询所有 - 分页
     * @param mapperName mapper.xml文件名-不带后缀
     * @param selectName mapper接口的方法名，与xml文件中id相对应
     * @param params 自定义参数，可为空
     * @param page 分页
     * @return
     */
    public PageInfo<Map<String, Object>> readList(String mapperName, String selectName, Object params, PageInfo<Map<String, Object>> page) {

        page = queryListOfColumn(mapperName, selectName, params, page);

        List<Map<String, Object>> list = page.getRows();

        //如果返回的有数据 - 开始对key值名称做转换为驼峰格式处理
//        if (!list.isEmpty()) {
//            int count = list.size();
//            for (int index = 0; index < count; index++) {
//                //set方法：用指定元素替换列表中指定位置的元素
//                list.set(index, CamelConverter.camelMap((Map)list.get(index)));
//            }
//        }

        return page;
    }

    /* - - - - - - - - - - - - - - - - - - - - 以上为Dao方法 - - - - - - - - - - - - - - - - - - - - */

    /* - - - - - - - - - - - - - - - - - - - -以下为辅助方法 - - - - - - - - - - - - - - - - - - - - */

    /**
     *
     * @param mapperName mapper.xml文件名-不带后缀
     * @param selectName mapper接口的方法名，与xml文件中id相对应
     * @param params 自定义参数，可为空
     * @param page 分页
     * @return
     */
    private PageInfo<Map<String, Object>> queryListOfColumn(String mapperName, String selectName, Object params, PageInfo<Map<String, Object>> page) {
        if (params == null) {
            params = new HashMap();
        }

//        easy-ui默认会传递sort,order等参数，此处对easy-ui参数做处理 - 根据前端框架自定义
//        if ((params instanceof Map)) {
//            Map<String, Object> mapParams = (Map)params;
//            String sortRules = (String)mapParams.remove("sortRules");
//            String sort = (String)mapParams.remove("sort");
//            String order = (String)mapParams.remove("order");
//            List<SortRule> sortRuleLists = EntityUtils.makeSortRuleList(sortRules, sort, order);
//            if (!sortRuleLists.isEmpty()) {
//                mapParams.put("_sort", EntityUtils.makeSortRuleStr(null, sortRuleLists));
//            }
//        }

        if (page == null) {//分页操作 - 默认1000条数据
            page = new PageInfo(1, 1000);
        }
        if (page.getPageNum() <= 1) {
            page.setPageNum(1);//返回1页数据
        }
        if (page.getPageSize() < 1) {
            page.setPageSize(20);//1页20条
        }
        page.startPage();//开始分页

        //执行sql，selectList传入mapper文件名和selectName id，param是查询所需参数
        List<Map<String, Object>> list = session.selectList(MapperUtils.getMapperName(mapperName, selectName), params);

        //此处可对多余字段或者不想展示的字段进行删除
//        if (!list.isEmpty()) {
//            for (int index = 0; index < list.size(); index++) {
//                Map<String, Object> entityMap = (Map)list.get(index);
//                entityMap.remove("ROW_ID");
//            }
//        }

        page.setRows(list);

        return page;
    }
}
